import userApi from '@/apis/user';
import type { UserApiType } from '@/apis/user/namespace';
import { CacheEnum } from '@/enum';
import { ResCode } from '@/enum/resCodeEnum';
import customStorage from '@/hooks/useStorage';
import { defineStore } from 'pinia';

export default defineStore('user', {
  state: () => ({
    userInfo: null as UserApiType.Info | null,
  }),
  actions: {
    /**
     * 获取用户信息
     * @returns
     */
    async getUserInfo() {
      const token = customStorage.getItem(CacheEnum.TOKEN_NAME);

      // 如果没有token，则清空用户信息, 并返回成功状态
      if (!token) {
        this.userInfo = null;
        return Promise.resolve();
      }

      // 调用接口获取用户信息
      this.userInfo = await userApi.info();
      if (!this.userInfo) return Promise.reject('获取用户信息失败！');
    },

    /**
     * 更改用户信息
     * @param data
     * @returns
     */
    async changeUserInfo(data: UserApiType.ChangeInfo) {
      const token = customStorage.getItem(CacheEnum.TOKEN_NAME);
      if (!token) return Promise.reject('请先登录！');

      // 调用接口修改用户信息
      const res = await userApi.update(data);
      if (res?.code !== ResCode.SUCCESS) return Promise.reject('修改用户信息失败！');

      // 重新获取用户信息
      this.getUserInfo();
      return Promise.resolve();
    },

    /**
     * 更改密码
     * @returns
     */
    async changePassword(data: UserApiType.ChangePassword) {
      const token = customStorage.getItem(CacheEnum.TOKEN_NAME);
      if (!token) return Promise.reject('请先登录！');

      // 调用接口修改密码
      const res = await userApi.updatePassword(data);
      if (res?.code !== ResCode.SUCCESS) return Promise.reject('修改密码失败！');

      // 重新获取用户信息
      this.getUserInfo();
      return Promise.resolve();
    },

    /**
     * 清空用户信息
     * @returns
     */
    clear() {
      this.userInfo = null;
    },
  },
});
